console.log('ts learn')
// 原始数据类型
let isDone: boolean = false

// 接下来来到 number，注意 es6 还支持2进制和8进制，让我们来感受下

let age1: number = 10
let binaryNumber: number = 0b1111

// 之后是字符串，注意es6新增的模版字符串也是没有问题的
let firstName: string = 'viking'
let message: string = `Hello, ${firstName}, age is ${age1}`

// 还有就是两个奇葩兄弟两，undefined 和 null
let u: undefined = undefined
let n1: null = null

// 注意 undefined 和 null 是所有类型的子类型。也就是说 undefined 类型的变量，可以赋值给 number 类型的变量：
let num1: number = undefined


// any 类型
let notSure: any = 4
notSure = 'maybe it is a string'
notSure = 'boolean'
// 在任意值上访问任何属性都是允许的：
notSure.myName
// 也允许调用任何方法：
// notSure.getName()


// Array 和 Tuple
//最简单的方法是使用「类型 + 方括号」来表示数组：
let arrOfNumbers: number[] = [1, 2, 3, 4]
//数组的项中不允许出现其他的类型：
//数组的一些方法的参数也会根据数组在定义时约定的类型进行限制：
arrOfNumbers.push(3)
arrOfNumbers.push(4)

// 元祖的表示和数组非常类似，只不过它将类型写在了里面 这就对每一项起到了限定的作用
let user1: [string, number] = ['viking', 20]
//但是当我们写少一项 就会报错 同样写多一项也会有问题
user1 = ['molly', 20]

// 内联类型  接口解决内联类型问题
let userAqie: {
  id: string;
  name: string;
  age: number;
} = {
  id: '001',
  name: 'aqie',
  age: 18
}

let usersAqie: string[]
userAqie.id = '003'

function getUserName(userAqie: {
  id: string;
  name: string;
  age: number;
}) {
  return userAqie.name
}